package com.szholly.pro.watergas_server.ps.schedule;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.szholly.data.general.GlobalParameter;
import com.szholly.data.general.RowBase;
import com.szholly.pro.watergas_server.common.data.DataUtil;
import com.szholly.pro.watergas_server.common.util.WeChatHelper;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.log4j.Logger;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import lrq.common.MyLog;

public class SendMessage implements Job {
	
	static Logger log;
	
	/**
	 * 信息发送模块
	 * 张文成
	 * 2016年11月4日
	 */
	//http://www.smschinese.cn/ 中国网建
	//用户名：深圳浩瑞泰，密码：haoruitai903
	//信息发送模块初步思路
	//创建MESSAGESEND表， Type用来筛选 以什么方式去， SendType :1 短信方式    2APP通知    
	//然后这个模块很简单，只做读取表中未发送的数据,再以相应的发送方式发送信息
	//其他模块生成信息，就直接往MESSAGESEND表中塞数据
	
	//MESSAGESEND表初步设计
	//  SendType :发送方式    messageReceiver:信息接收方    messageContext :信息内容       ContactWay:联系方式      isSend:是否已发送
	//    
	//比如说短信报警， 通过读取type得知是通过短信报警方式，定位到信息接收方，默认为用户，
	//然后通过用户读取到他们的联系方式，然后通过联系方式与信息内容直接发送短信
	//不同的发送方式，信息接收方有可能不同动
	//如何做好模块的兼容性，使之不局限在短信报警方式上？
	//入MESSAGESEND表数据的方法 专门写一个？  写在这个类里面吗。
	//写个静态方法，入数据的方法。
	
	
	
	/**
	 * 信息推送(以短信通知的形式)
	 * 张文成
	 * 2016年11月05日
	 */
	private void SendMessageBySMS(){
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
		String date = sdf.format(new Date());
		log.info("开始以短信通知发送信息,开始时间：" + date);
		try{
			//读取MESSAGESEND表中未发送的信息
			String sql="select t.guid,t.messagecontext,t1.c_usertel from MESSAGESEND t "
					+ " left join safe_user t1 on (t.messagereceiver = t1.s_userid) "
                    + " where isSend = 1 and sendtype = 1 and t.createtime > sysdate-1"; 
			List<GlobalParameter> parms = new ArrayList<GlobalParameter>();
			List<RowBase> rows = DataUtil.getSelectRows(sql, parms);
			if(rows.size()>0){
				for(RowBase row : rows){
					//逐条数据发送短信
					//获取电话号码c_usertel 与 信息内容 messagecontext
					//调用短信接口来发送信息
					//result来判定是否发送成功
					String messageContext = row.getSafeString("messagecontext");
					String telNum = row.getSafeString("c_usertel");
					String id = row.getSafeString("GUID");
					Pattern p = Pattern.compile("1\\d{10}");
					Matcher m = p.matcher(telNum);
					if(!m.matches())
					{
						//判断电话号码是否为空或者不为11位数字
						//更新isSend字段为3，不发送，无手机号码
						sql = "update MESSAGESEND set isSend = 3,SENDTIME = sysdate  where GUID = '"+id+"'";
						DataUtil.ExecuteUpdateSql(sql, parms);
						continue;
					}

					if(Integer.parseInt(executeSMS(telNum,messageContext)) > 0)
					{
						//更新isSend字段为2，已发送
						sql = "update MESSAGESEND set isSend = 2,SENDTIME = sysdate  where GUID = '"+id+"'";
						DataUtil.ExecuteUpdateSql(sql, parms);
					}
				} 
			}
			log.info("短信通知发送信息完毕,开始时间："+date);
			return;	
		} catch (Exception e)
		{
			log.error("以短信通知发送信息，发生错误",e);
		}
	}
	
	
	
	/**
	 * 信息推送(以微信通知的形式)
	 * 张文成
	 * 2016年11月05日
	 */
	private void SendMessageByWeChat(){
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
		String date = sdf.format(new Date());
		log.info("开始以微信通知发送信息,开始时间：" + date);
		try{
			//读取MESSAGESEND表中未发送的信息
			String sql="select t.guid,t.messagecontext,t1.wechatenter_id from MESSAGESEND t "
					+ " left join safe_user t1 on (t.messagereceiver = t1.s_userid) "
                    + " where isSend = 1 and sendtype = 2 and t.createtime > sysdate-1"; 
			List<GlobalParameter> parms = new ArrayList<GlobalParameter>();
			List<RowBase> rows = DataUtil.getSelectRows(sql, parms);
			if(rows.size()>0){
				for(RowBase row : rows){
					//逐条数据发送微信
					//获取企业微信号wechatenter_id 与 信息内容 messagecontext
					//调用微信接口来发送信息
					//result来判定是否发送成功
					String messageContext = row.getSafeString("messagecontext");
					String wechatEnter_id = row.getSafeString("wechatenter_id");
					String id = row.getSafeString("GUID");
					String accessToken = WeChatHelper.getAccessToken();
					String departmentID = WeChatHelper.getDepartmentID(accessToken, "报警推送");
					
					//判断企业号是已关注
					if(!WeChatHelper.isACUeser(accessToken,departmentID,wechatEnter_id))
					{
						//未关注
						//更新isSend字段为3，不发送，企业号未关注
						sql = "update MESSAGESEND set isSend = 3,SENDTIME = sysdate  where GUID = '"+id+"'";
						DataUtil.ExecuteUpdateSql(sql, parms);
						continue;	
					}
					
					if("0".equals(WeChatHelper.sendWeChatMessage(accessToken,wechatEnter_id,messageContext,departmentID)))
					{
						//更新isSend字段为2，已发送
						sql = "update MESSAGESEND set isSend = 2,SENDTIME = sysdate  where GUID = '"+id+"'";
						DataUtil.ExecuteUpdateSql(sql, parms);
					}
				} 
			}
			log.info("微信通知发送信息完毕,开始时间："+date);
			return;	
		} catch (Exception e)
		{
			log.error("以微信通知发送信息，发生错误",e);
		}
	}
	
	@Override
	public void execute(JobExecutionContext arg0) throws JobExecutionException {
		
		if(log == null){
			log = MyLog.getLogger("SendMessage");
		}
		 
		try {
			SendMessageBySMS(); //推送短信通知
			SendMessageByWeChat(); //推送微信通知
		} catch (Exception e) {
			log.error("发送信息出错",e);
		}
	}
	
	public void execute() throws JobExecutionException{
		execute(null);
	}
	
	
	/**
	 * MD5-32加密
	 * 张文成
	 * 2016年11月05日
	 */
	public static String Md5(String sourceStr){
	    String result = "";
	    try {
	        MessageDigest md = MessageDigest.getInstance("MD5");
	        md.update(sourceStr.getBytes());
	        byte b[] = md.digest();
	        int i;
	        StringBuffer buf = new StringBuffer("");
	        for (int offset = 0; offset < b.length; offset++) {
	            i = b[offset];
	            if (i < 0)
	                i += 256;
	            if (i < 16)
	                buf.append("0");
	            buf.append(Integer.toHexString(i));
	        }
	        result = buf.toString().toUpperCase();
	    } catch (NoSuchAlgorithmException e) {
	        System.out.println(e);
	    }
	    return result;
	}
	
	
	/**
	 * 调用中国网建的短信接口，执行短信发送
	 * 张文成
	 * 2016年11月05日
	 */
	public static String executeSMS(String telNum,String messageContext)
	{   
		String result = "";
		try{
			HttpClient client = new HttpClient();
			PostMethod post = new PostMethod("http://gbk.sms.webchinese.cn"); 
			post.addRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=gbk");//在头文件中设置转码
			String key = "80437cbebcc2184a9d26";
			key = Md5(key);
			NameValuePair[] data ={ new NameValuePair("Uid", "深圳浩瑞泰"),new NameValuePair("KeyMD5", key),new NameValuePair("smsMob",telNum),new NameValuePair("smsText",messageContext)};
			post.setRequestBody(data);
			client.executeMethod(post);
			result = new String(post.getResponseBodyAsString().getBytes("gbk")); 
			post.releaseConnection();
		}catch (Exception e) {
			log.error("调用短信发送接口出错",e);
		}
		return result;
	}
}
